#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
//全局变量
int plane_x,plane_y;//飞机位置
int high,width;//游戏画面尺寸 
int bullet_x, bullet_y;//子弹位置 
int enermy_x,enermy_y;//敌机位置 
int score;//分数设置 
int level_v;//游戏等级--速度的设置 
int level;//游戏等级 
int level_z;//游戏等级--分数到达一定分值的设置 





int gotoxy(int x,int y)//光标移动到（x，y） 位置 
{
	HANDLE handle = GetStdHandle (STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition (handle, pos);
} 





int hide()//隐藏光标 
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info);
} 





int starup()//游戏初始化 
{
	high=20;
	width=30;

	plane_x=high/2;
	plane_y=width/2;
	
	bullet_y=plane_y;
	bullet_x=-1; 
	
	enermy_y=width/2;
	enermy_x=1;
	
	score=0;
	
	level_v=20;
	level=1;
	level_z=5;
}





int show()//游戏显示
{
	gotoxy(0,0);//清屏 
	int i,j;
	for(i=0;i<=high;i++)
	{
		for(j=0;j<=width;j++)
		{
			if((i==plane_x)&&(j==plane_y))
				printf("▲");//显示飞机
			else if((i==plane_x+1)&&(j==plane_y))
				printf("▲");//显示飞机
			else if((i==plane_x+1)&&(j==plane_y-1))
				printf("▲");//显示飞机
			else if((i==plane_x+1)&&(j==plane_y+1))
				printf("▲");//显示飞机
			else if((i==plane_x+1)&&(j==plane_y-2))
				printf("▲");//显示飞机
			else if((i==plane_x+1)&&(j==plane_y+2))
				printf("▲");//显示飞机
			else if((i==plane_x+2)&&(j==plane_y-1))
				printf("▲");//显示飞机
			else if((i==plane_x+2)&&(j==plane_y+1))
				printf("▲");//显示飞机
				
			else if((i==0)||(i==high))//显示上下边框 
				printf("--");
			else if((j==0)||(j==width))//显示左右边框 
				printf("| ");
				
			else if((i==bullet_x)&&(j==bullet_y))
				printf("| ");//显示子弹
			else if((i==bullet_x+1)&&(j==bullet_y-1))
				printf("| ");//显示子弹
			else if((i==bullet_x+1)&&(j==bullet_y+1))
				printf("| ");//显示子弹
				
			else if((i==enermy_x)&&(j==enermy_y))
				printf("▼");//显示敌机 
			else
				printf("  ");//显示空格 
		}
		printf("\n");
	}
	printf("得分=%d\n",score);
	printf("游戏等级=%d",level);
}





int updataWithoutInput()//用户无关设置
{
	if( (bullet_x==enermy_x)&&(bullet_y==enermy_y) || (bullet_x+1==enermy_x)&&(bullet_y-1==enermy_y) || (bullet_x+1==enermy_x)&&(bullet_y+1==enermy_y) )
	{
		score++;
		enermy_x=1;
		enermy_y=rand()%(width-2);
		bullet_x=-1;
	}
	
	if(((plane_x==enermy_x)&&(plane_y==enermy_y))||((plane_y-1==enermy_y)&&(plane_x+1==enermy_x))||(plane_y+1==enermy_y)&&(plane_x+1==enermy_x)||(plane_y-2==enermy_y)&&(plane_x+1==enermy_x)||(plane_y+2==enermy_y)&&(plane_x+1==enermy_x))
	{
		score--;
		enermy_x=1;
		enermy_y=rand()%(width-2);                 //敌机撞到飞机时的设置 
	}
	
	if(score>=level_z)
	{
		level_v=level_v-1;
		level_z=level_z+5;
		level++; 
	}
	
	static int speed=0;//用于控制飞机下落速度 
	if(speed<level_v)
		speed++;
		
	if(bullet_x>-1)
		bullet_x--;
		
	if(enermy_x>high)   //敌机掉入深渊时 
		{
			enermy_x=1;
			enermy_y=rand()%(width-2);
		}
	else
		{
			if(speed==level_v)
			{
				enermy_x++;	
				speed=0;
			}
		}
}





int updataWithInput()//用户有关设置
{
	char input;
	if(kbhit())//当按下键时执行
	{
		input=getch();
		if(input==27)
			system("pause");
		if(input=='a'&&plane_y-3>0)                      //增加了防止飞机飞出边界的功能 
			plane_y--;
		if(input=='d'&&plane_y+3<width)
			plane_y++;
		if(input=='w'&&plane_x-1>0)
			plane_x--;
		if(input=='s'&&plane_x+3<high)
			plane_x++;
		if(input==' ')
		{
			bullet_x=plane_x-1;
			bullet_y=plane_y;
		}
	} 
}





int main()
{
	hide(); 
	starup();//数据初始化
	while(1)//游戏循环 
	{
		show();//游戏显示 
		updataWithoutInput();//用户无关设置 
		updataWithInput(); //用户有关设置 
	} 
	return 0; 
} 